package com.qifan.energy.http.net;

import com.qifan.energy.bean.result.LoginResult;
import com.qifan.energy.bean.vo.AddressAddVO;
import com.qifan.energy.bean.vo.BalanceWithdrawalVO;
import com.qifan.energy.bean.vo.CartItemVO;
import com.qifan.energy.bean.vo.GenerateOrderParamVO;
import com.qifan.energy.bean.vo.LoginVO;
import com.qifan.energy.bean.vo.RegisterVO;
import com.qifan.energy.bean.vo.UpdateInfoVO;
import com.qifan.energy.bean.vo.UpdatePwdVO;
import com.qifan.energy.global.Constant;
import com.qifan.energy.http.response.BaseResponse;
import com.qifan.energy.bean.request.MemberDistributeParam;
import com.qifan.energy.bean.result.CouponItem;
import com.qifan.energy.bean.result.MemberInfo;
import com.qifan.energy.bean.result.OrderItem;
import com.qifan.energy.bean.result.Page2;
import com.qifan.energy.bean.result.SearchItem;

import java.util.List;
import java.util.WeakHashMap;

import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;

public interface ApiService {

    //----------------------8085端口--------------------//
    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.getAuthCode)
    Observable<BaseResponse<String>> getAuthCode(@Query("telephone") String telephone);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.regist)
    Observable<BaseResponse<String>> regist(@Body RegisterVO registerVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.login)
    Observable<BaseResponse> login(@Body LoginVO loginVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.user_info)
    Observable<BaseResponse<MemberInfo>> userInfo();

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.refreshToken)
    Observable<BaseResponse<LoginResult>> refreshToken();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.logout)
    Observable<BaseResponse> logout();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.sso_applyPartner)
    Observable<BaseResponse> ssoApplyPartner();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.updatePwd)
    Observable<BaseResponse> updatePwd(@Body UpdatePwdVO updatePwdVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.updateInfo)
    Observable<BaseResponse<MemberInfo>> updateInfo(@Body UpdateInfoVO updateInfoVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.home_content)
    Observable<BaseResponse> homeContent();

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.home_productCateList)
    Observable<BaseResponse> homeProductCateList();

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.home_recommendProductList)
    Observable<BaseResponse> homeRecommendProductList();

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.home_distributeProductList)
    Observable<BaseResponse> homeDistributeProductList(@Query("pageNum") Integer pageNum,
                                                @Query("pageSize") Integer pageSize);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.home_normalProductList)
    Observable<BaseResponse> homeNormalProductList(@Query("pageNum") Integer pageNum,
                                                @Query("pageSize") Integer pageSize);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.cart_list)
    Observable<BaseResponse> cartList();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.cart_add)
    Observable<BaseResponse<Integer>> cartAdd(@Body CartItemVO cartItemVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.cart_clear)
    Observable<BaseResponse> cartClear();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.cart_delete)
    Observable<BaseResponse> cartDelete(@Query("ids") List<Integer> ids);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.cart_update_attr)
    Observable<BaseResponse> cartUpdateAttr(@Body CartItemVO cartItemVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.product_detail + "/{id}")
    Observable<BaseResponse> productDetail(@Path("id") String id);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.cart_update_quantity)
    Observable<BaseResponse> cartUpdateQuantity(@Query("id") Integer id,
                                                @Query("quantity") Integer quantity);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.member_address_list)
    Observable<BaseResponse> memberAddressList();

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.member_address_defaultAddress)
    Observable<BaseResponse> memberAddressDefaultAddress();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.member_address_add)
    Observable<BaseResponse> memberAddressAdd(@Body AddressAddVO addressAddVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.member_address_delete + "/{id}")
    Observable<BaseResponse> memberAddressDelete(@Path("id") Integer id);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.member_address_update + "/{id}")
    Observable<BaseResponse> memberAddressUpdate(@Path("id") Integer id ,@Body AddressAddVO addressAddVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.member_address_updateDefaultAddress + "/{id}")
    Observable<BaseResponse> memberAddressUpdateDefaultAddress(@Path("id") Integer id);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.aliyun_oss_policy)
    Observable<BaseResponse> aliyunOssPolicy();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.aliyun_oss_callback)
    Observable<BaseResponse> aliyunOssCallback();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.order_generateConfirmOrder)
    Observable<BaseResponse> orderGenerateConfirmOrder();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.order_buyNow)
    Observable<BaseResponse> orderBuyNow(@Body CartItemVO cartItemVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.order_generateOrder)
    Observable<BaseResponse> orderGenerateOrder(@Body GenerateOrderParamVO orderParamVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.order_alipay)
    Observable<BaseResponse> orderAlipay(@Body GenerateOrderParamVO orderParamVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.order_wxpay)
    Observable<BaseResponse> orderWXPay(@Body GenerateOrderParamVO orderParamVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.order_paySuccess)
    Observable<BaseResponse> orderPaySuccess(@Body GenerateOrderParamVO orderParamVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.product_search)
    Observable<BaseResponse<Page2<SearchItem>>> productSearch(@Query("keyword") String keyword
            , @Query("pageNum") Integer pageNum
            , @Query("pageSize") Integer pageSize);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.order_cancelUserOrder)
    Observable<BaseResponse> orderCancelUserOrder(@Query("orderId") Integer orderId);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.order_confirmReceiveOrder)
    Observable<BaseResponse> orderConfirmReceiveOrder(@Query("orderId") Integer orderId);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.order_deleteOrder)
    Observable<BaseResponse> orderDeleteOrder(@Query("orderId") Integer orderId);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.order_list)
    Observable<BaseResponse<Page2<OrderItem>>> orderList(@Query("status") Integer status
            , @Query("pageNum") Integer pageNum
            , @Query("pageSize") Integer pageSize);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.member_coupon_list)
    Observable<BaseResponse<List<CouponItem>>> memberCouponList(@Query("useStatus") Integer useStatus);

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.member_balance_alipay)
    Observable<BaseResponse> memberBalanceAliPay(@Query("alipayAccount") String aliPayAccount, @Query("realName") String realName);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.member_center_content)
    Observable<BaseResponse> memberCenterContent();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.member_balance_withdrawal_add)
    Observable<BaseResponse> memberBalanceWithdrawalAdd(@Body BalanceWithdrawalVO balanceWithdrawalVO);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.member_balance_balanceResult)
    Observable<BaseResponse> memberBalanceBalanceResult();

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.member_balance_history_search)
    Observable<BaseResponse> memberBalanceHistorySearch(@Query("changeType") Integer changeType
            ,@Query("changeReason") Integer changeReason
            , @Query("pageNum") Integer pageNum
            , @Query("pageSize") Integer pageSize);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.member_gameIntegration_gameIntegrationResult)
    Observable<BaseResponse> memberGameIntegrationGameIntegrationResult();

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.member_timeCard_timeCardResult)
    Observable<BaseResponse> memberTimeCardTimeCardResult();

    @Headers(Constant.BASEURL_KEY_8085)
    @POST(Constant.member_distribute_exchange)
    Observable<BaseResponse> memberDistributeExchange(@Body MemberDistributeParam memberDistributeParam);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.member_distribute_search)
    Observable<BaseResponse> memberDistributeSearch(@Query("saleStatus") Integer saleStatus
            , @Query("pageNum") Integer pageNum
            , @Query("pageSize") Integer pageSize);

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.member_center_contacts)
    Observable<BaseResponse> memberCenterContacts();

    @Headers(Constant.BASEURL_KEY_8085)
    @GET(Constant.app_version_control)
    Observable<BaseResponse> appVersionControl();

    //----------------------8081端口--------------------//
    /*@Headers(Constant.BASEURL_KEY_8081)
    @GET(Constant.esProduct_search)
    Observable<BaseResponse<Page2<SearchItem>>> esProductSearch(@Query("keyword") String keyword, @Query("pageNum") Integer pageNum, @Query("pageSize") Integer pageSize);*/

    //----------------------8080端口--------------------//


    //----------------------下面Demo-----------------------//
    /*//文件下载
    @GET()
    @Streaming
    //使用Streaming 方式 Retrofit 不会一次性将ResponseBody 读取进入内存，否则文件很多容易OOM
    Call<ResponseBody> downloadFile(@Url String fileUrl);//返回值使用 ResponseBody 之后会对ResponseBody 进行读取

    @GET()
    @Streaming
    Observable<ResponseBody> downloadFileWithUrlSync(@Url String fileUrl);*/
}
